package gomz.res;

import org.simpleframework.xml.ElementArray;

/**
 * @author Schatzmann
 * @author Murillo
 * Diese Klasse enthaelt alle Daten, welche sich auf ein Hexagramm beziehen
 * Ist abgeleitet von der HexagramCore Klasse und enthält somit auch eine ID und einen Namen
 */
public class Hexagram extends HexagramCore{

// ********************************************************************************
// Variablen
// ********************************************************************************
	//Im Array Index [0] befindet sich jeweils der offizielle Text eines Hexagramms 
	//und im Index [1] der persoenliche Kommentar dazu
	@ElementArray(required = false)
	private String[] judgement = new String[2];
	@ElementArray(required = false)
	private String[] image = new String[2];
	@ElementArray(required = false)
	private String[] comment = new String[2];
	@ElementArray(required = false)
	private String[] line1 = new String[2];
	@ElementArray(required = false)
	private String[] line2 = new String[2];
	@ElementArray(required = false)
	private String[] line3 = new String[2];
	@ElementArray(required = false)
	private String[] line4 = new String[2];
	@ElementArray(required = false)
	private String[] line5 = new String[2];
	@ElementArray(required = false)
	private String[] line6 = new String[2];
	
// ********************************************************************************
// Getter/Setter
// ********************************************************************************
	public String[] getJudgement() {
		return judgement;
	}
	public void setJudgement(String[] judgement) {
		this.judgement = judgement;
	}
	public String[] getImage() {
		return image;
	}
	public void setImage(String[] image) {
		this.image = image;
	}
	public String[] getComment() {
		return comment;
	}
	public void setComment(String[] comment) {
		this.comment = comment;
	}
	public String[] getLine1() {
		return line1;
	}
	public void setLine1(String[] line1) {
		this.line1 = line1;
	}
	public String[] getLine2() {
		return line2;
	}
	public void setLine2(String[] line2) {
		this.line2 = line2;
	}
	public String[] getLine3() {
		return line3;
	}
	public void setLine3(String[] line3) {
		this.line3 = line3;
	}
	public String[] getLine4() {
		return line4;
	}
	public void setLine4(String[] line4) {
		this.line4 = line4;
	}
	public String[] getLine5() {
		return line5;
	}
	public void setLine5(String[] line5) {
		this.line5 = line5;
	}
	public String[] getLine6() {
		return line6;
	}
	public void setLine6(String[] line6) {
		this.line6 = line6;
	}

// ********************************************************************************
// Konstruktor
// ********************************************************************************
	/**
	 * Leerer Konstruktor
	 */
	public Hexagram(){
		
	}
	
	/**
         * @author Murillo
         * Konstruktor um das Hexagramm zu kopieren
         * z.B. Klasse CQHexagramm Methode doSave
         * Falls speichert speichern nicht funktioniert, muessen die Orginal Werte noch vorhanden sein
	 */
	//Kein clone() da nicht sichtbar wer cloneable implementiert und tiefes kopieren einfacher
	public Hexagram(Hexagram hexagram){
		super.setId(hexagram.getId());
		super.setName(hexagram.getName());
		
		String[] tmpArr = new String[2];
		System.arraycopy(hexagram.getJudgement(), 0, tmpArr, 0, 2);
		this.setJudgement(tmpArr);
		tmpArr = new String[2];
		System.arraycopy(hexagram.getImage(), 0, tmpArr, 0, 2);
		this.setImage(tmpArr);
		tmpArr = new String[2];
		System.arraycopy(hexagram.getComment(), 0, tmpArr, 0, 2);
		this.setComment(tmpArr);
		tmpArr = new String[2];
		System.arraycopy(hexagram.getLine1(), 0, tmpArr, 0, 2);
		this.setLine1(tmpArr);
		tmpArr = new String[2];
		System.arraycopy(hexagram.getLine2(), 0, tmpArr, 0, 2);
		this.setLine2(tmpArr);
		tmpArr = new String[2];
		System.arraycopy(hexagram.getLine3(), 0, tmpArr, 0, 2);
		this.setLine3(tmpArr);
		tmpArr = new String[2];
		System.arraycopy(hexagram.getLine4(), 0, tmpArr, 0, 2);
		this.setLine4(tmpArr);
		tmpArr = new String[2];
		System.arraycopy(hexagram.getLine5(), 0, tmpArr, 0, 2);
		this.setLine5(tmpArr);
		tmpArr = new String[2];
		System.arraycopy(hexagram.getLine6(), 0, tmpArr, 0, 2);
		this.setLine6(tmpArr);
	}
	
	/**
	 * Konstruktor um ein Hexagramm direkt mit den Daten zu fuellen
	 * @param id ID des Hexagramms
	 * @param name Name des Hexagramms
	 * @param judgement [0] offizielles Urteil, [1] persoenliches Urteil
	 * @param image [0] offizielles Bild, [1] persoenliches Bild
	 * @param comment [0] offizieller Kommentar, [1] persoenliches Kommenter
	 * @param line1 [0] offizieller Text zur Linie 1, [1] persoenlicher Text zur Linie 1
	 * @param line2 [0] offizieller Text zur Linie 2, [1] persoenlicher Text zur Linie 2
	 * @param line3 [0] offizieller Text zur Linie 3, [1] persoenlicher Text zur Linie 3
	 * @param line4 [0] offizieller Text zur Linie 4, [1] persoenlicher Text zur Linie 4
	 * @param line5 [0] offizieller Text zur Linie 5, [1] persoenlicher Text zur Linie 5
	 * @param line6 [0] offizieller Text zur Linie 6, [1] persoenlicher Text zur Linie 6
	 */
	public Hexagram(String name,  String[] judgement, String[] image, String[] comment, String[] line1, String[] line2, String[] line3, String[] line4, String[] line5, String[] line6){
                super.setName(name);
		this.judgement = judgement;
		this.image = image;
		this.comment = comment;
		this.line1 = line1;
		this.line2 = line2;
		this.line3 = line3;
		this.line4 = line4;
		this.line5 = line5;
		this.line6 = line6;
	}
	
// ********************************************************************************
// Methoden
// ********************************************************************************
        
	/**
	 * Diese Methode gibt die Typen der 6 Linien von unten nach oben an (1 = Yin oder 0 = Yang)
         * @author Murillo
	 * @return int[] Typen der Linien von unten nach oben (Yin/Yang)
	 */
	public int[] getLineType(){
		int[] lines = new int[6];
		int binTestNum;
		
		//Binaer 0 steht fuer Yang, 1 steht fuer Yin
		for(int i = 0; i < 6; i++){
			binTestNum = (1<<i);
			if((super.getId() & binTestNum) == binTestNum) lines[i] = 1;
			else lines[i] = 0;
		}
		
		return (lines);
	}
}
